import axios from 'axios'
import type { InternalAxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage } from 'element-plus'

// 定义后端响应的基础结构
interface BackendResponse<T = unknown> {
  code: number
  msg: string
  data: T
}

// 定义药品规则列表的分页数据结构
export interface DrugPageData {
  total: number
  pages: number
  records: DrugRule[]
  current: number
  size: number
}

// 定义药品规则的详细结构
export interface DrugRule {
  id: number
  ruleName: string
  ruleType: string
  itemName: string
  is2024Medical: number
  limitGender: string
  ageLimit: string | null
  nationalItemCode: string | null
  remark: string | null
  title: string | null
  detectLogic: string
  logicBasis: string
  drugCodeCount: number
  serialNumber: string | null
  createTime: string
  updateTime: string
  isDeleted: number | null
}

// 定义药品代码的结构（关联关系表）
export interface DrugCode {
  drugCode: string
  drugSerial: string
  source: string
}

// 创建 axios 实例
const request = axios.create({
  baseURL: '/api', // 配合 Vite 代理转发到后端
  timeout: 5000
})

// 请求拦截器
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 可添加 Token 等请求头
    return config
  },
  (error) => {
    ElMessage.error('请求配置错误：' + error.message)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse<BackendResponse>): AxiosResponse['data'] => {
    if (response.status !== 200) {
      throw new Error(`HTTP 错误：${response.statusText}`)
    }
    const backendRes = response.data
    if (backendRes.code !== 200) {
      throw new Error(backendRes.msg || '业务处理失败')
    }
    return backendRes.data
  },
  (error) => {
    ElMessage.error(`网络错误：${error.message || '请检查网络'}`)
    return Promise.reject(error)
  }
)

// 药品规则接口（按后端控制器路径拆分）
export default {
  /**
   * 规则信息相关接口（对应 RuleInfoController - /rule）
   */
  // 获取规则列表（分页）
  getDrugList: (params: {
    pageNum: number
    pageSize: number
    itemName?: string
    limitGender?: string
  }) => {
    return request.get<DrugPageData>('/rule/page', { // 对应 /rule/page
      params: { ...params, ruleType: 'DRUG_GENDER' }
    })
  },

  // 新增规则
  addDrug: (data: Omit<DrugRule, 'id' | 'createTime' | 'updateTime'>) => {
    return request.post<DrugRule>('/rule/add', { ...data, ruleType: 'DRUG_GENDER' }) // 对应 /rule/add
  },

  // 编辑规则
  editDrug: (data: Partial<DrugRule>) => {
    return request.put<DrugRule>('/rule/update', { ...data, ruleType: 'DRUG_GENDER' }) // 对应 /rule/update
  },

  // 删除规则
  deleteDrug: (id: number) => {
    return request.delete<{ success: boolean }>(`/rule/delete/${id}`) // 对应 /rule/delete/{id}
  },

  // 获取单条规则详情
  getDrugDetail: (id: number) => {
    return request.get<DrugRule>(`/rule/detail/${id}`) // 对应 /rule/detail/{id}
  },

  /**
   * 根据规则ID分页查询药品关联列表（对应后端 getDrugRelationPage）
   * @param ruleId 规则ID（必传）
   * @param pageNum 页码
   * @param pageSize 每页条数
   */
  getDrugRelationPage: (params: {
    ruleId: number
    pageNum: number
    pageSize: number
  }) => {
    return request.get<{
      total: number
      records: DrugCode[] // 药品代码列表
      current: number
      size: number
    }>('/drug-relation/page', { // 对应后端 /drug-relation/page 接口
      params // 传递 ruleId、pageNum、pageSize
    })
  }
}
